#include "logmanager.h"

#include "u.h"


LogManager &LogManager::ins()
{
    static LogManager instance;
    return instance;
}

void LogManager::initialize(const QString &logDir)
{
    QMutexLocker locker(&mutex_);

    // 创建日志目录
    QDir dir(logDir);
    if (!dir.exists()) {
        dir.mkpath(".");
    }

    // 打开不同级别的日志文件
    openLogFile(debugFile_, dir.filePath("debug.log"));
    openLogFile(infoFile_, dir.filePath("info.log"));
    openLogFile(warningFile_, dir.filePath("warning.log"));
    openLogFile(errorFile_, dir.filePath("error.log"));

    // 安装全局日志处理器
    qInfo() << "日志系统初始化完成，目录:" << dir.absolutePath();
}

void LogManager::log(QtMsgType type, const QString &msg)
{
    ins().handleMessage(type, msg);
}

void LogManager::handleMessage(QtMsgType type, const QString &msg)
{
    QMutexLocker locker(&mutex_);
    QString logMessage = QString("[%1] %2\n").arg(U::getThDt(), msg);

    // 根据日志级别写入不同文件
    switch (type) {
    case QtDebugMsg:
        writeToFile(debugFile_, logMessage);
        return;
        break;
    case QtInfoMsg:
        writeToFile(infoFile_, logMessage);
        break;
    case QtWarningMsg:
        writeToFile(warningFile_, logMessage);
        break;
    case QtCriticalMsg:
    case QtFatalMsg:
        writeToFile(errorFile_, logMessage);
        break;
    }

    // 同时输出到控制台（可选）
    fprintf(stderr, "%s", logMessage.toLocal8Bit().constData());
    fflush(stderr);
}

void LogManager::openLogFile(QFile &file, const QString &filePath)
{
    if (file.isOpen()) {
        file.close();
    }
    file.setFileName(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
        fprintf(stderr, "无法打开日志文件: %s\n", filePath.toLocal8Bit().constData());
    }
}

void LogManager::writeToFile(QFile &file, const QString &message)
{
    if (file.isOpen()) {
        QTextStream stream(&file);
        stream << message;
        stream.flush();
    }
}
